// config.h
#pragma once

#include <functional>
#include <string>

namespace mini_redis {

enum class AofMode : char
{
    kNo,          // 不启用 AOF 持久化
    kEverySec,    // 每秒同步一次数据到磁盘(默认)
    kAlways       // 每次操作都立即同步到磁盘
};

struct AofOptions
{
    bool        enabled = false;    //是否启用 AOF（默认不启用）
    AofMode     mode    = AofMode::kEverySec;
    std::string dir     = "./data";             // AOF 文件存放目录
    std::string filename = "appendonly.aof";    // AOF 文件名

    // 性能调优参数
    size_t batch_bytes = 256 * 1024;    // 每批聚合写入的目标字节数
    int    batch_wait_us  = 1500;    // 聚合等待上限（微秒）
    size_t prealloc_bytes = 64 * 1024 * 1024;    // 初始预分配大小

    // everysec 实际同步周期（毫秒），可调平滑尾延迟
    int sync_interval_ms = 1000;

    // 写入后触发后台回写（SFR_WRITE）
    // 该调用可触发内核后台异步写入，减少阻塞。
    bool use_sync_file_range = false;

    // 达到该批量再调用 sync_file_range，避免过于频繁
    size_t sfr_min_bytes = 512 * 1024;
    // 每次 fdatasync 后对已同步范围做 DONTNEED
    bool fadvise_dontneed_after_sync = false;
};

struct RdbOptions
{
    bool        enabled  = true;
    std::string dir      = "./data";
    std::string filename = "dump.rdb";
};

struct ReplicaOptions
{
    bool        enabled     = false;
    std::string master_host = "";
    uint16_t    master_port = 0;
};

struct ServerConfig
{
    uint16_t       port         = 6379;
    std::string    bind_address = "0.0.0.0";
    AofOptions     aof;
    RdbOptions     rdb;
    ReplicaOptions replica;
};

class Defer
{
public:
    Defer(std::function<void()> func) : func_(func) {}
    ~Defer()
    {
        func_();
    }

private:
    std::function<void()> func_;
};

}    // namespace mini_redis
